package com.gylang.dict.repository;

import com.gylang.api.domain.EnumDictWrapper;
import com.gylang.common.core.page.TableDataInfo;
import com.gylang.dict.filter.EnumDictFilter;
import com.gylang.dict.resolver.IEnumDictResolver;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

/**
 * @author gylang
 * data 2021/6/17
 */
public interface EnumDictRepository extends BeanFactoryPostProcessor {


	/**
	 * 查询列表
	 *
	 * @param match 匹配查询
	 * @return
	 */
	List<EnumDictWrapper> match(Predicate<EnumDictWrapper> match);

	/**
	 * 总数
	 *
	 * @return
	 */
	Long total();

	/**
	 * 茶叶匹配
	 *
	 * @param match 匹配查询
	 * @param page  页面
	 * @param size  大徐爱
	 * @return
	 */
	TableDataInfo<EnumDictWrapper> matchLimit(Predicate<EnumDictWrapper> match, long page, long size);

	/**
	 * 通过名称获取
	 *
	 * @param name 通过名称查询字典
	 * @return
	 */
	EnumDictWrapper findOne(String name);

	/**
	 * 初始化
	 *
	 * @param enumDictWrapperList 枚举数据
	 */
	void init(List<EnumDictWrapper> enumDictWrapperList);

	/**
	 * 初始化
	 *
	 * @param configurableListableBeanFactory spring容器工厂
	 * @throws BeansException
	 */
	@Override
	default void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {


		// 执行装载和过滤
		List<EnumDictWrapper> enumDictWrapperList = new ArrayList<>();
		for (IEnumDictResolver iEnumDictResolver : configurableListableBeanFactory.getBeansOfType(IEnumDictResolver.class).values()) {
			enumDictWrapperList.addAll(iEnumDictResolver.resolve());
		}

		for (EnumDictFilter enumDictFilter : configurableListableBeanFactory.getBeansOfType(EnumDictFilter.class).values()) {
			enumDictFilter.filter(enumDictWrapperList);
		}

		this.init(enumDictWrapperList);
	}
}
